﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Management;
using System.Collections;
// namespaces necesarios para conexión a bd
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Data.SqlTypes;

using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace Persistencia_y_capa_de_negocio
{
    public class CADCuadrante
    {
        private static readonly CADCuadrante instancia = new CADCuadrante();
        public static CADCuadrante Instancia
        {
            get { return instancia; }
        }

        private string cadCon;  // Cadena de conexión conseguida desde app.config
        private SqlDataAdapter da;
        private SqlConnection c;
        private DataSet vdb;

        /// <summary>
        /// Constructor por defecto de la clase CADCuadrante
        /// </summary>
        public CADCuadrante()
        {
            try
            {
             cadCon = ConfigurationManager.ConnectionStrings["conexion"].ConnectionString;

            vdb = new DataSet();
            c = new SqlConnection(cadCon);
            da = new SqlDataAdapter("Select * from usuarios", c);

            da.Fill(vdb, "Bases");    // Ahora tenemos todo el contenido de usuariosencuadrantes en local.
            //Lo que se guarda en el data set es una tabla resultado de la sentencia select que nosotros llamremos
            //Bases
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

           
        }

        /// <summary>
        /// Comprueba si dadas unas coordenadas de una base en cuadrante esta ocupada por un usuario.
        /// </summary>
        /// <param name="xCuad">Variable con la coordenada x del cuadrante</param>
        /// <param name="yCuad">Variable con la coordenada y del cuadrante</param>
        /// <param name="xBase">Variable con la coordenada x de la base</param>
        /// <param name="yBase">Variable con la coordenada y de la base</param>
        public bool EstaOcupada(int xCuad, int yCuad, int xBase, int yBase)
        {
            DataTable t = new DataTable();
            DataRow dr = null;

            t = vdb.Tables["Bases"];
            string select = "cuadrante_x =" + xCuad + "and cuadrante_y=" + yCuad + "and coordenada_x=" + xBase + "and coordenada_y=" + yBase;
            try
            {
                dr = t.Select(select)[0];//Me permite obtener una columna que coincide con la busqueda por campos de la
                //sentencia select. En el caso de que no se encuentre devolvera una excepcion.
            }
            catch (Exception)
            {
                return false;
            }

            return true;
        }

        public int IDUsuario(int cx, int cy, int x, int y)
        {
            DataTable t = new DataTable();
            DataRow dr = null;
            t = vdb.Tables["Bases"];
            string select = "cuadrante_x =" + cx + "and cuadrante_y=" + cx + "and coordenada_x=" + x + "and coordenada_y=" + y;
            try
            {
                dr = t.Select(select)[0];
            }
            catch (Exception)
            {
                return -1;
            }
            return Convert.ToInt32(dr["id"].ToString());
        }

        /*
        public ArrayList getBases()
        {

            ArrayList listado = new ArrayList();
            DataTable t = new DataTable();
            t = vdb.Tables["Bases"];
            foreach (DataRow nuevafila in t.Rows)
            {
                ENCuadrante cuad = new ENCuadrante();
                cuad.CXCuadrante = nuevafila["cuadrante_x"];
                cuad.CYCuadrante = nuevafila["cuadrante_y"];
                cuad.CXBase = nuevafila["coordenada_x"];
                cuad.CYBase = nuevafila["coordenada_y"];
                cuad.UsuarioBase = nuevafila["usuario"];

                listado.Add(cuad);
            }
            return listado;
        }
        */

        /// <summary>
        /// Funcion que decuelve un DataSet con todas las bases en todos los cuadrantes
        /// Por ejemplo para mostrarlos en un DataGridView
        /// </summary>
        /// <returns> Devuelve el DataSet </returns>
        public DataSet getBases()
        {
            return vdb;
        }

        /// <summary>
        /// Permite obtener las coordenadas de la base de un determinado usuario dado su id.
        /// </summary>
        /// <param name="usuario1"> Entero que representa el id de usuario</param>
        /// <returns> Devuelve un objeto de tipo ENCuadrante</returns>
        public ENCuadrante getLocalizacionBasePorUsuario(int usuario1)
        {
            ENCuadrante cuad = new ENCuadrante();

            DataTable t = new DataTable();
            DataRow nuevafila = null;

            t = vdb.Tables["Bases"];
            string select = "usuario=" + usuario1;
            try
            {
                nuevafila = t.Select(select)[0];//Me permite obtener una columna que coincide con la busqueda por campos de la
                //sentencia select. En el caso de que no se encuentre devolvera una excepcion.
            }
            catch (Exception)
            {
                return null;
            }
            cuad.CXCuadrante = Convert.ToInt32(nuevafila["cuadrante_x"]);
            cuad.CYCuadrante = Convert.ToInt32(nuevafila["cuadrante_y"]);
            cuad.CXBase = Convert.ToInt32(nuevafila["coordenada_x"]);
            cuad.CYBase = Convert.ToInt32(nuevafila["coordenada_y"]);
            cuad.UsuarioBase = Convert.ToInt32(nuevafila["id"]);
            return cuad;
        }

    }
}
